package cn.iocoder.yudao.module.system.dal.mysql.task;

import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.module.system.dal.dataobject.task.UserTaskRecordDO;
import org.apache.ibatis.annotations.Mapper;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 用户任务记录 Mapper
 *
 * @author 芋道源码
 */
@Mapper
public interface UserTaskRecordMapper extends BaseMapperX<UserTaskRecordDO> {

    /**
     * 查询用户今日指定任务类型的完成次数
     *
     * @param userId 用户ID
     * @param taskType 任务类型
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 完成次数
     */
    default Long countTodayTaskByUserIdAndType(Long userId, Integer taskType, LocalDateTime startTime, LocalDateTime endTime) {
        return selectCount(new LambdaQueryWrapperX<UserTaskRecordDO>()
                .eq(UserTaskRecordDO::getUserId, userId)
                .eq(UserTaskRecordDO::getTaskType, taskType)
                .between(UserTaskRecordDO::getCompleteTime, startTime, endTime));
    }

    /**
     * 查询用户任务记录
     *
     * @param userId 用户ID
     * @return 任务记录列表
     */
    default List<UserTaskRecordDO> selectListByUserId(Long userId) {
        return selectList(new LambdaQueryWrapperX<UserTaskRecordDO>()
                .eq(UserTaskRecordDO::getUserId, userId)
                .orderByDesc(UserTaskRecordDO::getCompleteTime));
    }

    /**
     * 查询用户今日已获得的抽奖次数
     *
     * @param userId 用户ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 抽奖次数
     */
    default Integer sumTodayRewardLotteryCount(Long userId, LocalDateTime startTime, LocalDateTime endTime) {
        List<UserTaskRecordDO> records = selectList(new LambdaQueryWrapperX<UserTaskRecordDO>()
                .eq(UserTaskRecordDO::getUserId, userId)
                .eq(UserTaskRecordDO::getRewarded, true)
                .between(UserTaskRecordDO::getCompleteTime, startTime, endTime));
        
        return records.stream()
                .mapToInt(record -> record.getRewardLotteryCount() != null ? record.getRewardLotteryCount() : 0)
                .sum();
    }
}
